#include <stdio.h>
#include <stdlib.h>
//#include <unistd.h>
//#include <sys/stat.h>
//#include <memory.h>
#include <assert.h>

#include "../include/jpeglib.h"
#include "../include/mydata.h"
#include "../include/rgb2jpg.h"

//定义一个压缩对象，这个对象用于处理主要的功能  
static struct jpeg_compress_struct jpeg;  
//用于错误信息  
static struct jpeg_error_mgr jerr;  


 /*
 *功能：jpeg初始化
 *输入：
		image_height  image_width  quality(压缩质量)
 *输出：
 *		
 */
 
void jpeg_init(u32 image_width, u32 image_height,int quality)  
{  
      
    //错误输出在绑定  
    jpeg.err = jpeg_std_error(&jerr);  
    //初始化压缩对象  
    jpeg_create_compress(&jpeg);  
	
    //压缩参数设置  
    //设置24位的 image_width　X　image_height大小的ＲＧＢ图片  
    jpeg.image_width = image_width;  
    jpeg.image_height = image_height;  
    jpeg.input_components  = 3;  
    jpeg.in_color_space = JCS_RGB;  
	
    //参数设置为默认的  
    jpeg_set_defaults(&jpeg);  
	  
    // 指定亮度及色度质量  
    //jpeg.q_scale_factor[0] = jpeg_quality_scaling(100);  
    //jpeg.q_scale_factor[1] = jpeg_quality_scaling(100);  

    //设定编码jpeg压缩质量  
    jpeg_set_quality(&jpeg, quality, TRUE);  
     
    return;  
}  


 /*
 *功能：rgb_to_jpeg_file
 *输入：
		rgbDate(buff)  image_height  image_width  quality(压缩质量)
 *输出：
 *		
 */
 
void rgb_to_jpeg_file(u8 *rgbData, u32 width, u32 height, int quality)
{
	//初始化
	jpeg_init(width, height,quality); 
	
	//定义压缩后的输出，这里输出到一个文件！  
    FILE* pFile = fopen( "jpeg.jpg","wb" );  
	assert(NULL != pFile);
	
    //绑定输出  
    jpeg_stdio_dest(&jpeg, pFile);  
      
    //开始压缩。执行这一行数据后，无法再设置参数了！  
    jpeg_start_compress(&jpeg, TRUE);  
 
    
#if 1	
	JSAMPROW row_pointer[1];  
    //从上到下，设置图片中每一行的像素值  
	int i;
    for(i=0;i<jpeg.image_height;i++)  
    {  
        row_pointer[0] = rgbData+i*jpeg.image_width*3;  
        jpeg_write_scanlines( &jpeg,row_pointer,1 );  
    }  
#endif	

    //结束压缩  
    jpeg_finish_compress(&jpeg);  
  
    fclose( pFile );  
    pFile = NULL;  
    return;  
}

 /*
 *功能：rgb_to_jpeg_buff
 *输入：
		rgbData(buff)  image_height  image_width  quality(压缩质量)
 *输出：
 *		jpeg_buff的首地址和大小   dest(传参)  size(return)
 */
 
int rgb_to_jpeg_buff(u8 **dest, u8 *rgbData, u32 width, u32 height, int quality)
{
	//初始化
	jpeg_init(width, height,quality); 
    
    //绑定输出  
    unsigned long size = 0;
	jpeg_mem_dest(&jpeg, dest, &size);
      
    //开始压缩。执行这一行数据后，无法再设置参数了！  
    jpeg_start_compress(&jpeg, TRUE);  
        
#if 0  
	unsigned long row_stride = width * 3;
	JSAMPROW row_pointer[1];
	while(jpeg.next_scanline < jpeg.image_height)
	{
		row_pointer[0] = &rgbData[jpeg.next_scanline * row_stride];
		(void )jpeg_write_scanlines(&jpeg, row_pointer , 1);

	} 
	
#endif

#if 1	
	JSAMPROW row_pointer[1];
    //从上到下，设置图片中每一行的像素值  
	
	int i;
    for(i=0;i<jpeg.image_height;i++)  
    {  
        row_pointer[0] = rgbData+i*jpeg.image_width*3;  
        jpeg_write_scanlines( &jpeg,row_pointer,1 );  
    } 
	
#endif	

    //结束压缩  
    jpeg_finish_compress(&jpeg);  
	
    return (int)size;  
}


 /*
 *功能：jpeg_uninit 销毁jpeg
 *输入：
 *输出：
 *	
 */

void jpeg_uninit()
{
    //清空对象  
    jpeg_destroy_compress(&jpeg);   
} 

